package com.ambow.teaching.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

/**
 * 数据库连接工具。
 * 
 * @author deng.zhao
 *
 */
public class DBUtil {

	/**
	 * 数据库用户名。
	 */
	public static final String USER;
	/**
	 * 数据库密码。
	 */
	public static final String PASSWORD;
	/**
	 * 数据库连接字符串。
	 */
	public static final String URL;
	/**
	 * 数据库驱动类名。
	 */
	public static final String CLASSNAME;

	static {
		ResourceBundle bundle = ResourceBundle.getBundle("db");
		CLASSNAME = bundle.getString("jdbc.classname");
		URL = bundle.getString("jdbc.url");
		USER = bundle.getString("jdbc.user");
		PASSWORD = bundle.getString("jdbc.password");
	}

	/**
	 * 获取数据库连接。
	 * 
	 * @return 数据库连接；
	 * @throws SQLException
	 *             数据库异常；
	 */
	public static Connection getConnection() throws SQLException {
		Connection conn = null;
		try {
			Class.forName(CLASSNAME);
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 关闭给定的数据库连接对象和数据库语句对象。
	 * 
	 * @param conn
	 *            数据库连接对象；
	 * @param stmt
	 *            语句对象；
	 * @throws SQLException
	 *             数据库异常；
	 */
	public static void closeConnection(Connection conn, Statement stmt) throws SQLException {
		closeConnection(conn, stmt, null);
	}

	/**
	 * 关闭给定的数据库连接对象，数据库语句对象及数据库结果集对象。
	 * 
	 * @param conn
	 *            数据库连接对象；
	 * @param stmt
	 *            数据库语句对象；
	 * @param rs
	 *            数据库结果集对象；
	 * @throws SQLException
	 *             数据库异常；
	 */
	public static void closeConnection(Connection conn, Statement stmt, ResultSet rs) throws SQLException {

		if (rs != null) {
			rs.close();
		}
		if (stmt != null) {
			stmt.close();
		}
		if (conn != null) {
			conn.close();
		}
	}

	/**
	 * 
	 * @param sql
	 * @param objects
	 * @return
	 * @throws SQLException
	 *             数据库异常；
	 */
	public static int executeUpdate(String sql, Object... objects) throws SQLException {
		int rowCount = 0;
		Connection conn = null;
		PreparedStatement stmt = null;

		try {
			conn = DBUtil.getConnection();
			stmt = conn.prepareStatement(sql);
			for (int i = 0; i < objects.length; i++) {
				stmt.setObject(i + 1, objects[i]);
			}
			rowCount = stmt.executeUpdate();
		} finally {
			DBUtil.closeConnection(conn, stmt);
		}

		return rowCount;
	}

}
